useReducer:他基本上就是一個進階版的 useState ,同樣都是儲存且更新資料。
useState 長相如下 ⇩const [state, setState] = useState(initialState);
⇒ useState 可以透過 setState 更新 state
useReducer ⇩const [state, dispatch] = useReducer(reducer, initialArg, init);
⇒ useReducer 可以用類似 redux 用 reducer、action、dispatch 操作 state。
名詞解釋又來啦~
state :資料的狀態dispatch :接收 action 更新 state
reducer : 他是一個函式(old state, action) => { return "new state" }
action : 是一個 object 被用於描述 state 更新的方式 ,只能透過 dispatch 調用。initialArg : state 的初始值init : useReducer 的初始化 function接下來就來看一下如何使用吧
function init(initialCount) {
// 其實感覺就只是一個普通的function,
  return {count: initialCount};
}
// reducer function
function reducer(state, action) {
  switch (action.type) {
    case 'increment':
      return {count: state.count + 1};
    case 'decrement':
      return {count: state.count - 1};
    case 'reset':
      return init(action.payload);
	case 'sameReset':
    // 利用 payload 帶入初始值也能達到 init function 相同功能
      return {count: action.payload};
    default:
      throw new Error();
  }
}
// action = {type: 執行的動作, payload: 帶入執行動作的 data }
function Counter({initialCount}) {
  const [state, dispatch] = useReducer(reducer, initialCount, init);
  return (
    <>
      Count: {state.count}
      <button
        onClick={() => dispatch({type: 'reset', payload: initialCount})}>
        Reset
      </button>
			<button
        onClick={() => dispatch({type: 'sameReset', payload: initialCount})}>
        Same Reset
      </button>
      <button onClick={() => dispatch({type: 'decrement'})}>-</button>
      <button onClick={() => dispatch({type: 'increment'})}>+</button>
    </>
  );
}
看到這邊這邊大概能理解 useReducer 了吧,感恩官網讚嘆官網~
傻傻的我本來想把官網上提供 useReducer, useContext 的範例組合起來呈現一下如何使用。
結果一寫下去不得了,我這才發現他們其實都各自都能達到類似 Redux 功能,根本不需要組合起來,真是不打不相識啊。
不過天色漸晚明天再來好好解析他倆的不同吧。疑?好像又讓我混過一天了。